package com.hh.designPrinciples.DependencyInversion;

/**
 * @author huangh
 * @since 2019/11/12
 * @deprecated 依赖倒置原则
 * 定义：高层模块（指应用模块）不应该依赖底层模块，二者都应该依赖其抽象
 * <p>
 * 抽象不应该依赖细节；细节应该依赖抽象
 * 针对接口编程，不要针对实现编程
 * 核心思想：面向接口编程
 * <p>
 * 优点：
 * <p>
 * 减少类之间的耦合性
 * 提高系统稳定性
 * 提高代码可读性和维护性
 * 可降低修改程序锁造成的风险
 */
public class Test {
    public static void main(String[] args) {
        Hhao hhao = new Hhao();
        hhao.studyFECourse();
        hhao.studyJavaCourse();
        /**
         现在的问题是：如果要再增加一门学习课程呢？那么解决的方案只能在 hhao 类中增加另外一门课程的方法，然后Test（应用层）再调用该方法
         这破坏了_依赖倒置原则_，Test(应用层)依赖hhao（底层模块）。下面使用依赖倒置原则来进行修改
         */
        Gelly gelly = new Gelly();
        gelly.studyImoocCourse(new JavaCourse());
        gelly.studyImoocCourse(new FECourse());
        /*
        hhao 学习什么课程由 Test（应用层决定，高层模块）
        再学习其他的课程，只需要扩展课程即可。而 hhao 不需要变动
        在底层模块扩展
        是扩展课程，而不是去修改已有的 JavaCourse ，这也符合了_开闭原则_
        面向接口编程，而不是面对 hhao
        Test 与 hhao 是解耦的
        Gelly 与 具体的课程实现是解耦的
        Gelly 与 ICourse 是有依赖的
        所谓高内聚，低耦合，就是尽量减少耦合
         */
    }
}
